package com.bl.andr.utillib.encrypt;

/**
 * DESC: 字节转换工具类
 * TIME:2019-06-21
 */
public class ByteUtil {

    ///////////////////////////////////////////////////////////////////////////
    // 十六进制字符串 ==> 字节数组
    ///////////////////////////////////////////////////////////////////////////

    /**
     * 将16进制的字符串转换成byte数组，每2个16进制数字转成一个byte
     */
    public static byte[] hexStrToByte(String hex) {
        // 过滤其他字符
        hex = hex.replaceAll("[^0-9a-fA-F]", "");
        byte[] bytes = new byte[hex.length() / 2];
        for (int i = 0; i < bytes.length; i++) {
            bytes[i] = (byte) Integer.parseInt(hex.substring(i * 2, i * 2 + 2),
                    16);
        }
        return bytes;
    }


//    public static byte[] hexStrToByte2(String hex) {
//        int len = (hex.length() / 2);
//        byte[] result = new byte[len];
//        char[] achar = hex.toCharArray();
//        for (int i = 0; i < len; i++) {
//            int pos = i * 2;
//            result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));
//        }
//        return result;
//    }
//
//
//    private static int toByte(char c) {
//        return (byte) "0123456789ABCDEF".indexOf(c);
//    }

    ///////////////////////////////////////////////////////////////////////////
    // 字节数组 ==> 十六进制字符串
    ///////////////////////////////////////////////////////////////////////////

    public static String byteToHexStr(byte buf[]) {
        StringBuilder sb = new StringBuilder();
        for (byte aBuf : buf) {
            String hex = Integer.toHexString(aBuf & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }


    public static String byteToHexStr2(byte[] bytes) {
        StringBuilder buf = new StringBuilder(bytes.length * 2);
        for (byte aByte : bytes) {
            int tmp = (aByte >> 4) & 0x0F;
            buf.append(getHexChar(tmp));

            tmp = aByte & 0x0F;
            buf.append(getHexChar(tmp));
        }

        return buf.toString();
    }


    private static char getHexChar(int value) {
        if (value >= 0 && value < 10) {
            return (char) ('0' + value);
        } else {
            return (char) ('A' + (value - 10));
        }
    }


    ///////////////////////////////////////////////////////////////////////////
    // 字节数组 ==> 十六进制字符串
    ///////////////////////////////////////////////////////////////////////////

    public static String toBinary(int num) {
        String value = Integer.toBinaryString(num);

        if (value.length() < 8) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 8 - value.length(); i++) {
                sb.append("0");
            }
            sb.append(value);
            return sb.toString();
        }
        return value;
    }


}



